// var a = { id: { id: 1 } }
// var b = JSON.parse(JSON.stringify(a)); // 遍历法
// // 3个浅拷贝方法 3个深拷贝方法
// // JSON.parse(JSON.stringify(a)) 确定不能拷贝函数 
// // 遍历法去拷贝函数
// b.id.id = 2
// console.log(a.id.id)


// 作用域
// ES5
function app() {
    // 函数作用域
}
(function () {
    // 块级作用域
})()

// ES6
{
    // let const 只要用了let const 那么就会产生一个作用域
}
() => {

}
for (let i = 1; i++; i < 10) {
    // 产生作用域
}
// 作用域链


var a = 1;
function app() {
    console.log(a)
    var b = 2;
    child()
    function child() {
        console.log(b)
    }
    console.log(b)
}
app()
// 查找某个变量  =》 当前作用域  =》 父级作用域 =》 window



// 原型链是什么 

// 每个对象都有一个隐式原型 __proto__
// 每个构造函数都有一个显示原型 prototype
// 对象的隐式原型指向它构造函数的显示原型
// {}.__proto__ === Object.prototype

var a = {};
console.log(a.id)
// {}本身查找 => __proto__ => Object.prototype => Object.prototype.__proto__ => null


// Vue响应式数据劫持 怎么劫持的数组
// 修改了数组的原型方法 


// this指向

// 普通函数指向调用者
// 箭头函数指向 上下文
// 如何改变this  call apply bind
// call apply 是改变+调用   bind是只改变不调用


// 回调地狱
// axios.get('/aaa').then(() => {
//     console.log(123)
//     axios.get('/bbb').then(() => {
//         console.log(123)
//         axios.get('/ccc').then(() => {
//             console.log(123)
//             axios.get('/aaa').then(() => {
//                 console.log(123)
//                 axios.get('/aaa').then(() => {
//                     console.log(123)
//                     axios.get('/aaa').then(() => {
//                         console.log(123)
//                     })
//                 })
//             })
//         })
//     })
// })
// Promise.then 链式调用
// Promise 是解决异步  不对
// Promise只是一种异步的写法 并不能解决异步  他可以用来处理回调地狱问题
// Promise内部是同步的
// all race catch resolve reject
// all 全部成功则成功
// race 获取最先结束的promise
// catch 捕获操作 
// catch和then的第二个参数有什么区别？
// catch可以捕获整条then链的报错  二then第二个参数只能捕获上一层的报错




// async await  将异步代码以同步的方式书写
// await 下面代码是一个微任务
// 是gengerator的语法糖
// async function app() {
//     await axios.get('/aaa')
//     await axios.get('/bbb')
//     await axios.get('/ccc')
// }

// gengerator
// function* app() {
//     yield axios.get('/aaa')
//     yield axios.get('/bbb')
//     yield axios.get('/ccc')
//     return 4
// }

// const a = app()
// console.log(a.next())
// console.log(a.next())
// console.log(a.next())
// console.log(a.next())